/*================================================================
*   Copyright (C) 2020 belonging to YangZhengQing. All rights reserved.
*   
*   文件名称：tlv_unpack.c
*   创 建 者：YangZhengQing
*   创建日期：2020年03月03日
*   描    述：
*
*================================================================*/


#include <stdio.h>

#include "server.h"

/*
 功能：数据包解包
 参数：
	data:待解包的数据报文
	buff:数据缓存区
	size:数据域大小
 返回：成功返回0，失败返回-1

 */

int tlv_unpack(unsigned char *data, unsigned char *buff, int *size)
{
	u8				crc;//CRC校验和
	CRC_8			type;
	int				length;//数据包总长度
	unsigned char	byte[4];//内容域字节形式

	int				i;

	//CRC初始化
	type.poly       = POLYNOMIAL;//多项式
	type.InitValue  = INITVAL;//初始值
	type.xor        = XOR;//异或值
	type.InputReverse = TRUE;
	type.OutputReverse= TRUE;

	length = pack_length(data);//计算数据报文的长度

	crc	= crc8(data,length-1,type);//CRC校验
	if(crc != data[length-1])
	{
		printf("crc校验失败!\n");
		return -1;
	}

	//解包
	if(data[0] == HEAD && data[1] == TAG_SAMPLE)//判断报文头和类型
	{
		//取内容域长度
		for(i = 0; i < 4; i++)
		{
			byte[i] = data[i+2];
		}
		*size = to_int(byte);//字节转int

		//取内容
		for(i = 0; i < *size; i++)
		{
			
			buff[i] = data[i+6];
		}
	}

	return 0;
}



/*
  功能：计算出数据报文的总长度
  参数：
	data:数据报文
  返回：数据报文长度
 */
int pack_length(unsigned char *data)
{
	int				length = 0;

	while(data[length] != REAR)
	{
		length++;
	}

	return length;
}


